gusucode.com > VC 达内MFC例子集源码-源码程序 > VC 达内MFC例子集源码-源码程序/code/20110106/day08.txt

    一 映射 CMap
  
  1 CMap的内存构造
    HashTable - 哈希表
    
    int <-> CString
       1) 3 - "Test1"
       2) 1 - "Test2"    
       3) 0 - "Test3"
       4) 2 - "Test4"
       5) 6 - "Test5"
       6) 7 - "Test6"
    index = key%4
	    [0] -> "0, Test3, pNext" 
	    [1] -> "1, Test2, pNext"
	    [2] -> "2, Test4, pNext" 
	        -> "6, Test5, pNext" 
	        ...
	    [3] -> "3, Test1, pNext" 
	        -> "7, Test10, pNext"
    index = key%8
      [0] -> "0, Test3, pNext"
      [1] -> "1, Test2, pNext"
      [2] -> "2, Test4, pNext"
      [3] -> "3, Test1, pNext" 
      [4]
      [5]
      [6] -> "6, Test5, pNext"
      [7] -> "7, Test10, pNext"
    
    CMap当中,初始化HastTable,需要估算
    数据量N, 实际初始化长度M:
        M = N * 1.2 + 1;
     例如: 估算数据量100,HastTable实际
      长度 100 * 1.2 + 1 = 121
        
  2 CMap的使用
    2.1 数据类的定义
      2.1.1 要有默认不带参数的构造函数,
        或者参数全部具有默认值.
      2.1.2 将 operator= 重载实现.
    2.2 CMap的定义
      template< class KEY, //KEY的类型
      class ARG_KEY, //KEY参数类型
      class VALUE, //Value的类型
      class ARG_VALUE >//Value参数类型
      class CMap : public CObject
    2.3 初始化Hashtable
      CMap::InitHashTable - 设置长度
      CMap::GetHashTableSize - 获取长度
      CMap默认长度17.
    2.4 数据的添加
      CMap::SetAt
      CMap::operator[]
    2.5 数据的查找
      CMap::Lookup
      CMap::operator[]
    2.6 数据的遍历
      CMap::GetStartPosition - 获取起始位置
      CMap::GetNextAssoc - 获取本POS的
         数据以及下一个节点POS
    2.7 数据节点
     在CMap中,使用CAssoc构造HashTable以
     及在节点中保存KEY和VALUE
     struct CAssoc
	   {
		  CAssoc* pNext;//下一个节点
		  UINT nHashValue;//提高遍历效率
		  KEY key;//KEY的值
		  VALUE value; //VALUE的数据
	   };
	   
	  2.8 数据的删除
	    CMap::RemoveKey - 删除指定的KEY
	    CMap::RemoveAll - 删除所有的数据

    2.9 数据数量的获取
      CMap::GetCount - 获取数量
      CMap::IsEmpty - 判断是否为空
    
    2.10 关于内存管理
      如果使用的new的数据,在删除时要
      自己删除.CMap不会提供删除.
      CMap<int, int, CAnimal *, CAnimal *>  mapIntToAnimal

二 MFC的文件

  1 MFC的文件相关
    CFile - 父类是CObject, 封装了文件
      基本操作.
    CFileFind - 父类是CObject,封装了
      文件的搜索等操作.
      
  2 CFile文件的使用
    2.1 文件的创建或打开
      virtual BOOL Open( 
      LPCTSTR lpszFileName, //文件名及路径
      UINT nOpenFlags, //打开或创建方式
      CFileException* pError = NULL );
      创建或打开成功返回TRUE.
    2.2 文件的关闭
      CFile::Close()
    2.3 数据的读写
      virtual void Write( const void* lpBuf, UINT nCount );
           throw( CFileException );
      virtual UINT Read( void* lpBuf, UINT nCount );
           throw( CFileException );
      当读写数据产生错误时,会抛出异常.
    2.4 文件指针
      Seek - 文件指针到指定的位置
      SeekToBegin - 文件指针到文件头
      SeekToEnd - 文件指针到文件尾
    2.5 Flush函数
      强制将文件缓冲区的数据写入文件.
    2.6 其他函数
      文件长度 GetLength/SetLength
      状态信息 GetStatus/SetStatus 
      
  3 CFileFind 的使用
    3.1 查找
       CFileFind::FindFile
    3.2 获取同时查找下一个
       CFileFind::FindNextFile
    3.3 关闭
       CFileFind::Close
    3.4 其他
      获取信息
      判断类型
   
三 MFC序列化    

	1 MFC序列化
	  采用数据流的方式对数据、对象进行
	  存储或读取.
	  
	2 CArchive类
	  2.1 CArchive类 
	  提供了一种数据缓冲机制,用于数据
	  或对象的读取和存储。
	  
	  2.2 数据的读取"<<"和">>"
	  将数据保存数据缓冲或者从数据缓冲
	  读取数据。
	  
	  2.3 数据缓冲,CArchive类内部的
	    数据
	    CArchive使用三个指针维护一个数据
	    缓冲内存:
			BYTE* m_lpBufCur - 当前地址
			BYTE* m_lpBufMax - 缓冲区最大地址
			BYTE* m_lpBufStart - 缓冲区起始地址
			
				|<---------------------->| 
		m_lpBufStart    |       m_lpBufMax
				       m_lpBufCur
	  2.3.1 当写入数据时,剩余空间是否
	    满足需求
	   m_lpBufCur + 需要的空间 > m_lpBufMax
	  2.3.2 如果满足需求,执行2.3.4
	  2.3.3 如果不满足需求,它会调用Flush
	    函数保存数据到文件,并且将m_lpBufCur
	    指针设置到起始位置(m_lpBufStart)
	  2.3.4 将数据保存到m_lpBufStart的
    地址。
	  2.3.5 将m_lpBufStart的地址向后偏移
	    需要保存的数据长度。
	    
	3 CArchive类的使用
	  3.1 打开文件
	  3.2 定义CArchive类
	  3.3 数据读写
	  3.4 关闭CArchive类
	  3.5 关闭文件